"""
常用的类内置方法

__init _构造方法，是Python类内置的方法之一。
这些内置的类方法，各自有各自特的功能，这些内置方法我们称之为：魔术方法

常用的魔术方法：
- __init__  构造方法
- __str__   字符串方法
- __lt__    小于、大于符号比较
- __le__    小于等于、大于等于符号比较
- __eq__    ==符号比较

"""

# print("======================= __str__ 字符串方法")
#
#
# class Student:
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     # 魔术方法
#     def __str__(self):
#         return "学生姓名：%s,年龄：%d" % (self.name, self.age)
#
#
# stu = Student("张三", 18)
# print(stu)
# print(str(stu))  # 当不定义魔术方法时，打印的是内存地址，定义后打印的是自定义语句

# print("======================= __lt__  小于、大于符号比较")
#
#
# class Student:
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     # 魔术方法
#     def __lt__(self, other):
#         """
#         :param other: 另一个类对象
#         :return: True/False
#         """
#         return self.age < other.age
#
#
# stu1 = Student("张三", 18)
# stu2 = Student("李四", 20)
# print(stu1 < stu2)  # 直接对2个对象进行比较是不可以的，但是在类中实现lt方法，即可同时完成：小于符号 和 大于符号 2种比较
# print(stu1 > stu2)  # 直接对2个对象进行比较是不可以的，但是在类中实现lt方法，即可同时完成：小于符号 和 大于符号 2种比较

# print("======================= __le__  小于等于、大于等于符号比较")
#
#
# class Student:
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#     def __le__(self, other):
#         """
#         :param other: 另一个类对象
#         :return: True/False
#         """
#         return self.age <= other.age
#
#
# stu1 = Student("张三", 18)
# stu2 = Student("李四", 20)
# print(stu1 <= stu2)  # 直接对2个对象进行比较是不可以的
# print(stu1 >= stu2)

print("======================= __eq__  等于符号比较")


class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __eq__(self, other):
        """
        :param other: 另一个类对象
        :return: True/False
        """
        return self.age == other.age


stu1 = Student("张三", 18)
stu2 = Student("李四", 20)
print(stu1 == stu2)
print(stu1 != stu2)
"""
不实现__eq__方法，对象之间可以比较，但是是比较内存地址，也即是：不同对象==比较一定是False结果。 
实现了__eq__方法，就可以按照自己的想法来决定2个对象是否相等了。
"""